/*
Opleiding	: Basisvaardigheden SQL Query's schrijven van SQLTeam.NL
Module		: Query performance

Opdrachten
----------

*/
-- Voorbeeldquery
SELECT TOP 100
	c.Id,
	c.UserId,
	c.Score
FROM dbo.Comments c
WHERE c.CreationDate >= '2009-07-01' 
	AND c.CreationDate < '2009-08-01'

/*
	Opdracht
	- Maak voor bovenstaande query een covering nonclustered index
	- Zet het Actual execution plan aan
	- Controleer na het aanmaken van de index of er een Index Seek wordt gebruikt
*/
-- Onderstaande indexen zijn correct
CREATE NONCLUSTERED INDEX [TijdelijkeIndex] ON dbo.Comments (CreationDate,UserId,Score)
CREATE NONCLUSTERED INDEX [TijdelijkeIndex] ON dbo.Comments (CreationDate,Score,UserId)

/*
Onderstaande index is onjuist, omdat de index moet beginnen met het veld of de velden
uit het filter of de filters. Wanneer onderstaande index zou zijn gebruikt,
gebruikt SQL Server een Index Scan ipv van een Index Seek.

CREATE NONCLUSTERED INDEX [TijdelijkeIndex] ON dbo.Comments (Score,CreationDate,UserId)
*/

/*
	Opdracht
	Zorg in het voorbeeldquery ervoor, dat er ipv een index seek
	een key lookup wordt gedaan
*/
SELECT TOP 100
	c.Id,
	c.UserId,
	c.Text,
	c.Score
FROM dbo.Comments c
WHERE c.CreationDate >= '2009-07-01' 
	AND c.CreationDate < '2009-07-07' -- kleinere datum reeks!

/*
	Uitleg
	------
	1. Er moet eerst een veld geselecteerd die niet in de index staat
	2. Om een Clustered Index Scan te voorkomen moet de datum worden ingeperkt,
		anders is een Clustered Index Scan voor SQL Server 'voordeliger'
*/

/*
	Opdracht
	Verwijder bovenstaande index
*/
DROP INDEX [TijdelijkeIndex] on dbo.Comments

